package com.slashvision.im

import android.util.Log

/**
 * 日志封装
 * @time 2018/7/28  14:03
 */
object SLog {
    private const val strTag = "[StylistLog]"
    fun v(strTag: String, msg: String) {
        if (isDebug()) {
            Log.v(
                strTag,
                "(${getFile()}:${getLineNumber()}):${getClass()}.${getFunction()} -> $msg"
            )
        }
    }

    fun d(strTag: String, msg: String) {
        if (isDebug()) {
            /*Log.d(
                strTag,
                "[Pid:" + Process.myPid() + "][Tid:" + Process.myTid() + "]" + "[" + strTag + "] " + msg
            )*/
            Log.d(strTag, "(${getFile()}:${getLineNumber()}):${getClass()}.${getFunction()} -> $msg")
        }
    }

    fun i(strTag: String, msg: String) {
        if (isDebug()) {
            Log.i(
                strTag,
                "(${getFile()}:${getLineNumber()}):${getClass()}.${getFunction()} -> $msg"
            )
        }
    }

    fun w(strTag: String, msg: String) {
        if (isDebug()) {
            Log.w(
                strTag,
                "(${getFile()}:${getLineNumber()}):${getClass()}.${getFunction()} -> $msg"
            )
        }
    }

    fun e(strTag: String, msg: String) {
        if (isDebug()) {
            Log.e(
                strTag,
                "(${getFile()}:${getLineNumber()}):${getClass()}.${getFunction()} -> $msg"
            )
        }
    }

    fun e(strTag: String, msg: String, e: Throwable?) {
        if (isDebug()) {
            Log.e(
                strTag,
                "(${getFile()}:${getLineNumber()}):${getClass()}.${getFunction()} -> $msg",
                e
            )
        }
    }

    fun wtf(strTag: String, msg: String) {
        if (isDebug()) {
            Log.wtf(
                strTag,
                "(${getFile()}:${getLineNumber()}):${getClass()}.${getFunction()} -> $msg"
            )
        }
    }

    /**
     * 打印当前函数名
     */
    fun f(tag: String) {
        if (isDebug()) {
            Log.v(tag, "(${getFile()}:${getLineNumber()}):${getClass()}.${getFunction()}")
        }
    }

    fun f(tag: String, extra: String) {
        if (isDebug()) {
            Log.v(tag, "(${getFile()}:${getLineNumber()}):${getClass()}.${getFunction()} -> ${extra}")
        }
    }

    private fun getStackTrace() = Thread.currentThread().stackTrace

    private val level = 5
    private fun getFile()= getStackTrace()[level].fileName
    private fun getLineNumber() = getStackTrace()[level].lineNumber
    private fun getClass() = getStackTrace()[level].className
    private fun getFunction() = getStackTrace()[level].methodName

    fun isDebug():Boolean {
        return BuildConfig.DEBUG
//        return false
    }
}